const Koa = require('koa')

const app = new Koa();


// 内部会将多个函数组合成一个promise,当【最外层】的promise执行后，会将ctx.body的结果显示到页面
// 所有的use中的函数 都必须添加async 和 await 因为你不知道后面的逻辑是否有异步操作 如果不加await可能会出现不可控的问题
// 我们可以使用await 也可以使用return 因为都可以达到等待下一个promise执行完毕
// 都会把最外层的函数执行完毕
app.use(async (ctx, next) => {
    console.log(1)
    // 不加await 打印 1  3 2 hahaha 5 6 4 页面显示hello
    // 加await 打印 1 3 hahaha 5 6 4 2 页面显示hello
    // ctx.body = 'hello'
    await next()
    ctx.body = 'hello'
    console.log(2)
})
app.use(async(ctx, next) => {
    console.log(3)
    await new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('hahahaha')
            resolve()
        }, 1000)
    })
    next()
    ctx.body = 'world'
    console.log(4)
})
app.use((ctx, next) => {
    console.log(5)
    next()
    console.log(6)
})
// next 前面必须加await 这样才能保证后面的中间件可以正常执行
// 所有的异步方法都必须变成promise 因为await 可以等待promise完成

app.listen(3000, () => {
    console.log('server start port 3000')
})